package com.radon.conf;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * 网关过滤器
 *
 */
//@Component
public class DemoFilter extends ZuulFilter {

    /**
     * 编写过滤器拦截业务逻辑代码
     * 环境：拦截所有服务接口，判断是否有传userToken
     */
    public Object run() throws ZuulException {
        //拦截所有的服务接口，判断服务接口是否有传递UserToken参数
        //1.首先要获取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        //2.获取request对象
        HttpServletRequest request = currentContext.getRequest();
        //3.一般获取token的时候 从请求头中获取token参数，这里只是演示方便
        String userToken = request.getParameter("userToken");
        if(StringUtils.isEmpty(userToken)) {
            //不会继续执行...不会调用服务接口，网关服务直接响应给客户端
            //返回一个错误提示
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseBody("userToken is null");
            currentContext.setResponseStatusCode(401);
            return null;
        }
        //正行执行调用其他服务接口...
        return null;
    }
    /**
     * 判断过滤器是否生效
     */
    public boolean shouldFilter() {
        return true;
    }
    /**
     * 表示过滤器执行顺序，当一个请求在同一阶段时存在
     * 多个过滤器时，多个过滤器执行顺序问题
     */
    public int filterOrder() {
        return 0;
    }
    /**
     * 表示过滤器类型 "pre"表示请求之前进行
     */
    public String filterType() {
        return "pre";
    }
}
